package com.qfedu.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qfedu.dao.StudentDao;
import com.qfedu.entity.ResponseData;
import com.qfedu.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service //service 层的实例bean 使用@Service   ，并且加入到容器
public class StudentServiceImpl implements StudentService {

    @Autowired // 需要从容器中获取一个 studentDao
    private StudentDao studentDao;

    @Override
    public Student findStudentById(int id) {
        return studentDao.findStudentById(id);
    }

    /**
     * propagation = Propagation.REQUIRED  传播行为 必须有事务
     * isolation= Isolation.REPEATABLE_READ  隔离级别可重复读 mysql 默认隔离级别，
     *                                      注意mysql 虽然是可重复度但是可以解决幻读问题
     * timeout = 10000  事务的超时时间\
     *, readOnly = true
     *                      * true：只读，可提高查询效率。(适合查询)
     *
     *                  * false：可读可写。 (默认值)（适合增删改）
     * @param id1
     * @param id2
     * @return
     */
    @Transactional(propagation = Propagation.REQUIRED,
            isolation= Isolation.REPEATABLE_READ,timeout = 10000,readOnly = false)// 表示当前方法中所有执行的sql 都会开启事务，在同一个事务中
    @Override
    public boolean deleteStudentByIds(int id1, int id2) {

        // 执行多条sql ,为保证数据的 一致性 ，必须开启事务
        int num1 = studentDao.deleteStudentById(id1);

        int i = 1/0;

        int num2 = studentDao.deleteStudentById(id2);

        if (num1>0 && num2>0){
            return true;
        }

        return false;
    }

    @Override
    public ResponseData<Student> findAllStudentByPage(int page, int limit) {

        // 1.开启分页 PageHelper.startPage()
        PageHelper.startPage(page,limit);

        // 2.查询所有 学生 pageHelper分页插件自动添加 limit
        List<Student> allStudent = studentDao.findAllStudent();

        PageInfo<Student> pageInfo = new PageInfo<>(allStudent);

        // 获取该表中的总行数
        long total = pageInfo.getTotal();


        // 3.封装 ResponseData<Student>
        ResponseData<Student> responseData = new ResponseData<>();

        if (!allStudent.isEmpty()){
            responseData.setCode(0); //有数据
            responseData.setMsg("success");
            responseData.setCount((int) total);
            responseData.setData(allStudent);
        }else {
            responseData.setCode(1); //没有数据
            responseData.setMsg("error");
        }


        return responseData;
    }

    @Override
    public boolean deleteStudentById(int id) {

        int num = studentDao.deleteStudentById(id);

        if (num>0){
            return true;
        }

        return false;
    }

    @Override
    public boolean updateStudentById(Student student) {

        int num = studentDao.updateStudentById(student);

        if (num>0){ // 影响的行数 大于0  ，更新成功
            return true;
        }

        return false;
    }
}
